package com.efrei.schoolmanager.views;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.print.PrinterException;
import java.io.File;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.Set;
import java.util.Vector;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.GroupLayout;
import javax.swing.GroupLayout.Alignment;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.table.TableColumn;

import org.hibernate.HibernateException;

import com.efrei.schoolmanager.controlers.ControleurEleves;
import com.efrei.schoolmanager.exceptions.LogicException;
import com.efrei.schoolmanager.exceptions.PDFException;
import com.efrei.schoolmanager.model.ModeleBulletinNotes;
import com.efrei.schoolmanager.model.obj.Classe;
import com.efrei.schoolmanager.model.obj.Eleve;
import com.efrei.schoolmanager.model.obj.Responsable;
import com.efrei.schoolmanager.printing.GenerePdf;
import com.efrei.schoolmanager.printing.PrintPdf;
import com.efrei.schoolmanager.tools.Periode;
import com.efrei.schoolmanager.tools.Tools;
import com.efrei.schoolmanager.views.components.CustomButton;
import com.efrei.schoolmanager.views.components.CustomTextField;

/**
 * Vue du bulletin des notes
 */
public class VueBulletinNotes extends JPanel {
	private static final long serialVersionUID = 8056421047452627601L;

	private final static String TITLE = "Bulletin de notes de la Periode ";

	// Frame proprietaire de ce panel
	private JFrame proprio;

	// JPanels
	private JPanel titlePanel, centerPanel, NomPrenomPanel, NomPrenomWestPanel,
			responsablesPeriodesPanel, responsableWestPanel, messageLabelPanel,
			messagePanel, messageLabelWestPanel, buttonsPanel,
			buttonsCenterPanel, moyenneElevePanel, moyenneClassePanel,
			InfosPanel, aRemplirPanel, notesPanel, avisJuryPanel,
			avisJuryWestPanel;

	// JButtons
	private CustomButton enregistrerButton, imprimerButton;

	// JLabels
	private JLabel titleLabel, responsableLabel, nomLabel, prenomLabel,
			classeLabel, messageLabel, moyenneClasseLabel,
			moyenneClasseValueLabel, moyenneEleveValueLabel, moyenneEleveLabel,
			avisJuryLabel, selectionPeriodeLabel;

	// JTextField
	private CustomTextField nomEleveTextField, prenomEleveTextField,
			classeEleveTextField;

	// JTextfield non personnalisé
	private JTextField sujetTextField;

	// JTable
	private JTable notesTable;

	// Modele contenant les notes
	private ModeleBulletinNotes modelBulletinNotes;

	// JCombobox
	private JComboBox responsableComboBox, avisJuryComboBox, periodeComboBox;

	// CustomTextArea
	private JTextArea messageArea;

	// Vector contenant les avis de jury disponibles
	private Vector<String> avisJury;

	// Eleve selectionne précédemment dans la dialog
	private Eleve eleveSelectionne;

	// Le controleur des eleves
	private ControleurEleves controleur;

	// Classe de l'eleve précédemment precedement dans la dialog
	private Classe classeActuelle;

	/**
	 * Constructeur de la Vue Je lance la dialog de choix de l'eleve, si
	 * l'utilisateur annule son choix je ne continue plus le deroulement
	 * 
	 * @param proprio
	 * @throws HibernateException
	 * @throws LogicException
	 */
	public VueBulletinNotes(JFrame proprio) throws HibernateException,
			LogicException {
		super();
		selectionEleve();
		if (eleveSelectionne != null) {
			recupClasseActuelle();
			this.proprio = proprio;
			initLabel();
			initButtons();
			initTextArea();
			initTextField();
			initComboBox();
			initTable();
			remplirChampsGeneraux();
			initRemplirNomPrenomPanel();
			initRemplirTitlePanel();
			initRemplirMoyenneElevePanel();
			initRemplirmoyenneClasseLabel();
			initRemplirAvisJuryPanel();
			initRemplirMessageLabelPanel();
			initRemplirMessagePanel();
			initRemplirButtonsPanel();
			initRemplirResponsablesPeriodesPanel();
			initRemplirInfosPanel();
			initRempliraRemplirPanel();
			initRemplirNotesPanel();
			initRemplirCenterPanel();
			updateCalculsMoyennes();
			configurerVue();
		}
	}

	/**
	 * Calcul des moyennes a partir du modele de bulletin de notes
	 */
	private void updateCalculsMoyennes() {
		DecimalFormat df = new DecimalFormat("##.##");
		float moyenneEleve = 0;
		float moyenneClasse = 0;
		for (int i = 0; i < modelBulletinNotes.getRowCount(); i++) {
			System.out.println(modelBulletinNotes.getValueAt(i, 3));

			String moyenneClasseStr = ((String) modelBulletinNotes.getValueAt(
					i, 3)).replace(",", ".");
			String moyenneEleveStr = ((String) modelBulletinNotes.getValueAt(i,
					2)).replace(",", ".");

			moyenneClasse += Float.valueOf(moyenneClasseStr);
			moyenneEleve += Float.valueOf(moyenneEleveStr);

		}
		moyenneClasse = moyenneClasse / modelBulletinNotes.getRowCount();
		moyenneEleve = moyenneEleve / modelBulletinNotes.getRowCount();
		moyenneClasseValueLabel.setText(df.format(moyenneClasse));
		moyenneEleveValueLabel.setText(df.format(moyenneEleve));
	}

	/**
	 * Remplissage des champs generaux (nom ,prenom, responsables associes)
	 */
	private void remplirChampsGeneraux() {
		// Recuperation du nom et prenom
		nomEleveTextField.setText(eleveSelectionne.getNom().toUpperCase());
		prenomEleveTextField.setText(eleveSelectionne.getPrenom());

		// Recuperation des reponsables
		Set<Responsable> Setresponsables = eleveSelectionne
				.getResponsablesLegaux();
		responsableComboBox.addItem("-- Choisir un responsable --");
		for (Responsable responsable : Setresponsables) {
			responsableComboBox.addItem(responsable);
		}

		// Set du nom de la classe
		if (classeActuelle != null) {
			classeEleveTextField.setText(classeActuelle.getNom());
		} else {
			classeEleveTextField.setText("No classe ?");
		}

	}

	/**
	 * Recherche de la classe de l'eleve,selon la regle de la promotion la plus
	 * elevee
	 * 
	 * @return
	 */
	private Classe recupClasseActuelle() {
		Set<Classe> setClasses = eleveSelectionne.getClasses();
		classeActuelle = null;
		for (Classe classe : setClasses) {
			if (classeActuelle == null) {
				classeActuelle = classe;
			}
			if (classe.getPromotion() > classeActuelle.getPromotion()) {
				classeActuelle = classe;
			}
		}

		return classeActuelle;
	}

	/**
	 * Lancement de la dialogue retournant l'eleve selectionne
	 * 
	 * @throws HibernateException
	 * @throws LogicException
	 */
	private void selectionEleve() throws HibernateException, LogicException {
		// Initialisation de la transaction
		controleur = new ControleurEleves();
		// Recherche d'un eleve
		VueRechercherEleve dialog = new VueRechercherEleve(proprio, controleur);
		eleveSelectionne = dialog.showDialog();
	}

	private void initRemplirmoyenneClasseLabel() {
		moyenneClassePanel = new JPanel(new FlowLayout());
		moyenneClassePanel.add(moyenneClasseLabel);
		moyenneClassePanel.add(moyenneClasseValueLabel);
	}

	private void initRemplirMoyenneElevePanel() {
		moyenneElevePanel = new JPanel(new FlowLayout());
		moyenneElevePanel.add(moyenneEleveLabel);
		moyenneElevePanel.add(moyenneEleveValueLabel);
	}

	private void initRemplirAvisJuryPanel() {
		avisJuryPanel = new JPanel();
		GroupLayout layout = new GroupLayout(avisJuryPanel);
		avisJuryPanel.setLayout(layout);
		layout.setAutoCreateGaps(true);
		layout.setAutoCreateContainerGaps(true);
		GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();
		hGroup.addGroup(layout.createParallelGroup()
				.addComponent(avisJuryLabel));
		hGroup.addGroup(layout.createParallelGroup().addComponent(
				avisJuryComboBox));
		layout.setHorizontalGroup(hGroup);
		GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();
		vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE)
				.addComponent(avisJuryLabel).addComponent(avisJuryComboBox));
		layout.setVerticalGroup(vGroup);
		avisJuryWestPanel = new JPanel(new BorderLayout());
		avisJuryWestPanel.add(avisJuryPanel, BorderLayout.WEST);
	}

	/**
	 * Initialisation de la table des notes et remplissage de ses donnees a
	 * partir du model de bulletin notes
	 */
	private void initTable() {
		modelBulletinNotes = new ModeleBulletinNotes(eleveSelectionne,
				classeActuelle);
		notesTable = new JTable(modelBulletinNotes);
		notesTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

		resizeColumns();

	}

	/**
	 * Methode de resizing des columns pour les adapter en fonctions des besoins
	 * (en particulier pour les remarques des professeurs)
	 */
	private void resizeColumns() {
		TableColumn col = notesTable.getColumnModel().getColumn(0);
		col.setPreferredWidth(100);

		TableColumn col1 = notesTable.getColumnModel().getColumn(1);
		col1.setPreferredWidth(100);

		TableColumn col2 = notesTable.getColumnModel().getColumn(2);
		col2.setPreferredWidth(70);

		TableColumn col3 = notesTable.getColumnModel().getColumn(3);
		col3.setPreferredWidth(70);

		TableColumn col4 = notesTable.getColumnModel().getColumn(4);
		col4.setPreferredWidth(600);
	}

	/**
	 * Remplissage du panel contenant le jtable de notes avec une scrollbar
	 * affichee si besoin est
	 */
	private void initRemplirNotesPanel() {
		notesPanel = new JPanel(new BorderLayout());
		JScrollPane jsp = new JScrollPane(notesTable,
				JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
				JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		jsp.setPreferredSize(new Dimension(800, 200));
		notesPanel.add(jsp, BorderLayout.NORTH);
	}

	/**
	 * Remplissage du panel de completion pour les remarques du jury
	 */
	private void initRempliraRemplirPanel() {
		aRemplirPanel = new JPanel();
		BoxLayout bl = new BoxLayout(aRemplirPanel, BoxLayout.PAGE_AXIS);
		aRemplirPanel.setLayout(bl);
		aRemplirPanel.add(messageLabelWestPanel);
		aRemplirPanel.add(messagePanel);
		aRemplirPanel.add(avisJuryPanel);
		aRemplirPanel.setBorder(BorderFactory
				.createTitledBorder("A completer si besoin"));

	}

	/**
	 * Remplissage des Infos generales sur l'eleve
	 */
	private void initRemplirInfosPanel() {
		InfosPanel = new JPanel();
		BoxLayout bl = new BoxLayout(InfosPanel, BoxLayout.PAGE_AXIS);
		InfosPanel.setLayout(bl);
		InfosPanel.add(NomPrenomWestPanel);
		InfosPanel.add(responsableWestPanel);
		InfosPanel.setBorder(BorderFactory
				.createTitledBorder("Infos Eleves et responsable"));

	}

	/**
	 * Remplissage du panel de choix du responsables et de la periode
	 */
	private void initRemplirResponsablesPeriodesPanel() {
		responsablesPeriodesPanel = new JPanel();
		GroupLayout layout = new GroupLayout(responsablesPeriodesPanel);
		responsablesPeriodesPanel.setLayout(layout);
		layout.setAutoCreateGaps(true);
		layout.setAutoCreateContainerGaps(true);
		GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();
		hGroup.addGroup(layout.createParallelGroup().addComponent(
				responsableLabel));
		hGroup.addGroup(layout.createParallelGroup().addComponent(
				responsableComboBox));
		hGroup.addGroup(layout.createParallelGroup().addComponent(
				selectionPeriodeLabel));
		hGroup.addGroup(layout.createParallelGroup().addComponent(
				periodeComboBox));
		layout.setHorizontalGroup(hGroup);
		GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();
		vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE)
				.addComponent(responsableLabel)
				.addComponent(responsableComboBox)
				.addComponent(selectionPeriodeLabel)
				.addComponent(periodeComboBox));
		layout.setVerticalGroup(vGroup);
		responsableWestPanel = new JPanel(new BorderLayout());
		responsableWestPanel.add(responsablesPeriodesPanel, BorderLayout.WEST);
	}

	/**
	 * Initialisation de la combobox des avis jury, et de selection des periodes
	 */
	private void initComboBox() {
		responsableComboBox = new JComboBox();

		avisJury = new Vector<String>();
		avisJury.add("------ Selectionner un avis ------");
		avisJury.add("Felicitations");
		avisJury.add("Encouragement");
		avisJury.add("Compliments");
		avisJury.add("Avertissement travail");
		avisJuryComboBox = new JComboBox(avisJury);

		Vector<Periode> periodeVector = new Vector<Periode>();
		for (int i = Tools.getPeriodeCourante(); i != 0; i--) {
			Periode periodetemp = new Periode(i);
			periodeVector.add(periodetemp);
		}
		periodeComboBox = new JComboBox(periodeVector);
		periodeComboBox
				.addActionListener(new PeriodeBulletinNotesListListener());
	}

	private void initRemplirButtonsPanel() {
		buttonsPanel = new JPanel(new FlowLayout());
		buttonsPanel.add(enregistrerButton);
		buttonsPanel.add(imprimerButton);
		buttonsCenterPanel = new JPanel(new BorderLayout());
		buttonsCenterPanel.add(buttonsPanel, BorderLayout.CENTER);
	}

	private void initRemplirMessagePanel() {
		messageArea.setLineWrap(true);
		JScrollPane jsp = new JScrollPane(messageArea);
		messagePanel = new JPanel(new BorderLayout());
		messagePanel.add(jsp, BorderLayout.WEST);
	}

	private void initRemplirMessageLabelPanel() {
		messageLabelPanel = new JPanel();
		GroupLayout layout = new GroupLayout(messageLabelPanel);
		messageLabelPanel.setLayout(layout);
		layout.setAutoCreateGaps(true);
		layout.setAutoCreateContainerGaps(true);
		GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();
		hGroup.addGroup(layout.createParallelGroup().addComponent(messageLabel));
		layout.setHorizontalGroup(hGroup);
		GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();
		vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE)
				.addComponent(messageLabel));
		layout.setVerticalGroup(vGroup);
		messageLabelWestPanel = new JPanel(new BorderLayout());
		messageLabelWestPanel.add(messageLabelPanel, BorderLayout.WEST);

	}

	/**
	 * Remplissage du paneau central contenant la table et les moyennes
	 * generales
	 */
	private void initRemplirCenterPanel() {
		centerPanel = new JPanel();
		BoxLayout bl = new BoxLayout(centerPanel, BoxLayout.PAGE_AXIS);
		centerPanel.setLayout(bl);
		centerPanel.add(Box.createRigidArea(new Dimension(10, 10)));
		centerPanel.add(InfosPanel);
		centerPanel.add(Box.createRigidArea(new Dimension(10, 20)));

		JPanel jp1 = new JPanel();
		BoxLayout bl1 = new BoxLayout(jp1, BoxLayout.PAGE_AXIS);
		jp1.setLayout(bl1);
		jp1.add(notesPanel);
		jp1.add(moyenneClassePanel);
		jp1.add(moyenneElevePanel);

		JPanel jp = new JPanel(new BorderLayout());
		jp.setBorder(BorderFactory.createTitledBorder("Bulletin"));
		jp.add(jp1, BorderLayout.WEST);
		centerPanel.add(jp);
		centerPanel.add(Box.createRigidArea(new Dimension(10, 20)));
		centerPanel.add(aRemplirPanel);
		centerPanel.add(Box.createRigidArea(new Dimension(10, 20)));
		centerPanel.add(buttonsCenterPanel);
		centerPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
	}

	private void initTextField() {
		nomEleveTextField = new CustomTextField();
		nomEleveTextField.setEditable(false);
		prenomEleveTextField = new CustomTextField();
		prenomEleveTextField.setEditable(false);
		classeEleveTextField = new CustomTextField();
		classeEleveTextField.setEditable(false);
		sujetTextField = new JTextField();
		sujetTextField.setMinimumSize(new Dimension(488, 20));
	}

	private void initRemplirTitlePanel() {
		titlePanel = new JPanel();
		titlePanel.add(titleLabel);
	}

	private void configurerVue() {
		this.setLayout(new BorderLayout());
		this.add(titlePanel, BorderLayout.NORTH);
		this.add(centerPanel, BorderLayout.CENTER);
	}

	private void initRemplirNomPrenomPanel() {
		NomPrenomPanel = new JPanel();
		GroupLayout layout = new GroupLayout(NomPrenomPanel);
		NomPrenomPanel.setLayout(layout);
		layout.setAutoCreateGaps(true);
		layout.setAutoCreateContainerGaps(true);
		GroupLayout.SequentialGroup hGroup = layout.createSequentialGroup();
		hGroup.addGroup(layout.createParallelGroup().addComponent(nomLabel));
		hGroup.addGroup(layout.createParallelGroup().addComponent(
				nomEleveTextField));
		hGroup.addGroup(layout.createParallelGroup().addComponent(prenomLabel));
		hGroup.addGroup(layout.createParallelGroup().addComponent(
				prenomEleveTextField));
		hGroup.addGroup(layout.createParallelGroup().addComponent(classeLabel));
		hGroup.addGroup(layout.createParallelGroup().addComponent(
				classeEleveTextField));
		layout.setHorizontalGroup(hGroup);
		GroupLayout.SequentialGroup vGroup = layout.createSequentialGroup();
		vGroup.addGroup(layout.createParallelGroup(Alignment.BASELINE)
				.addComponent(nomLabel).addComponent(nomEleveTextField)
				.addComponent(prenomLabel).addComponent(prenomEleveTextField)
				.addComponent(classeLabel).addComponent(classeEleveTextField));
		layout.setVerticalGroup(vGroup);
		NomPrenomWestPanel = new JPanel(new BorderLayout());
		NomPrenomWestPanel.add(NomPrenomPanel, BorderLayout.WEST);
	}

	private void initTextArea() {
		messageArea = new JTextArea(5, 70);
	}

	private void initButtons() {
		enregistrerButton = new CustomButton("Enregistrer le document");
		enregistrerButton
				.addActionListener(new EnregistrerBulletinNotesListener());
		imprimerButton = new CustomButton("Imprimer le document");
		imprimerButton.addActionListener(new ImprimerBulletinNotesListener());
	}

	private void initLabel() {
		titleLabel = new JLabel(TITLE);
		titleLabel.setFont(new Font("Arial", Font.BOLD, 20));
		nomLabel = new JLabel("Nom Eleve:");
		prenomLabel = new JLabel("Prenom Eleve :");
		classeLabel = new JLabel("Classe Eleve :");
		messageLabel = new JLabel("Remarque du Jury :");
		responsableLabel = new JLabel("Envoyer au responsable :");
		moyenneClasseLabel = new JLabel("Moyenne Classe :");
		moyenneEleveLabel = new JLabel("Moyenne Eleve : ");
		avisJuryLabel = new JLabel("Avis du jury :");
		moyenneClasseValueLabel = new JLabel("15,7");
		moyenneClasseValueLabel.setFont(new Font("Arial", Font.BOLD, 15));
		moyenneEleveValueLabel = new JLabel("13,3");
		moyenneEleveValueLabel.setFont(new Font("Arial", Font.BOLD, 15));
		selectionPeriodeLabel = new JLabel("Selectionner Periode :");
	}

	/**
	 * Selon le choix ou non d'un avis jury je retourn le choix ou null
	 * 
	 * @return le string de l'avis ou null
	 */
	private String treatementAvisJury() {
		if (avisJuryComboBox.getSelectedIndex() != 0) {
			return (String) avisJuryComboBox.getSelectedItem();
		} else {
			return null;
		}
	}

	/**
	 * Retourn le choix du responsable
	 * 
	 * @return le responsable ou null
	 */
	private Responsable getSelectedResponsable() {
		if (responsableComboBox.getSelectedIndex() == 0)
			return null;
		return (Responsable) responsableComboBox.getSelectedItem();
	}

	/**
	 * Methode pour l'enregistrement du pdf genere
	 * 
	 * @author Julien
	 * 
	 */
	class EnregistrerBulletinNotesListener implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {
			Responsable responsableChoisi = getSelectedResponsable();
			// Controle qu'un responsable est bien choisi
			if (responsableChoisi == null) {
				if (responsableComboBox.getItemCount() == 1) {
					// Si l'eleve ne possede pas de responsable affichage d'un
					// message d'erreur
					Tools.displayError(
							"Veuillez ajouter un responsable a cet eleve (Lister eleve puis modifier eleve).\n Ceci est necessaire pour la generation du document",
							"Pas de responsable");
				} else {
					// Si il y a au moins un responsable mais qu'aucun n'est
					// selectionne j'affiche egalement un message d'erreur
					Tools.displayError("Selectionner un responsable",
							"Responsable manquant");
				}
			} else if (modelBulletinNotes.getRowCount() == 0) {
				// Si il n'y a pas au moins une notes pour l'eleve dans la
				// periode concernee j'annule le lancement de l'impression
				Tools.displayError(
						"Il n'y a pas de notes pour cet eleve dans cette periode",
						"Pas de notes : Impression annulee");
			} else {
				// Choix de l'emplacement du fichier a imprimer
				JFileChooser jfc = new JFileChooser();
				jfc.showSaveDialog(proprio);
				if (jfc.getSelectedFile() != null) {
					try {
						// Generation du pdf
						GenerePdf.generePdfBulletinNotes(messageArea.getText(),
								(Responsable) responsableComboBox
										.getSelectedItem(), eleveSelectionne,
								modelBulletinNotes, jfc.getSelectedFile(),
								moyenneEleveValueLabel.getText(),
								moyenneClasseValueLabel.getText(),
								treatementAvisJury(), (Periode) periodeComboBox
										.getSelectedItem(), classeActuelle
										.getNom());
					} catch (PDFException ex) {
						System.err.println(ex);
						Tools.displayError(
								"Une erreur est survenue: " + ex.getMessage(),
								"Erreur");
					}
				}
			}

		}
	}

	/**
	 * Methode pour l'impression du pdf genere
	 * 
	 * @author Julien
	 * 
	 */
	class ImprimerBulletinNotesListener implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {
			Responsable responsableChoisi = getSelectedResponsable();
			// Controle qu'un responsable est bien choisi
			if (responsableChoisi == null) {
				if (responsableComboBox.getItemCount() == 1) {
					// Si l'eleve ne possede pas de responsable affichage d'un
					// message d'erreur
					Tools.displayError(
							"Veuillez ajouter un responsable a cet eleve (Lister eleve puis modifier eleve).\n Ceci est necessaire pour la generation du document",
							"Pas de responsable");
				} else {
					// Si il y a au moins un responsable mais qu'aucun n'est
					// selectionne j'affiche egalement un message d'erreur
					Tools.displayError("Selectionner un responsable",
							"Responsable manquant");
				}
			} else if (modelBulletinNotes.getRowCount() == 0) {
				// Si il n'y a pas au moins une notes pour l'eleve dans la
				// periode concernee j'annule le lancement de l'impression
				Tools.displayError(
						"Il n'y a pas de notes pour cet eleve dans cette periode",
						"Pas de notes : Impression annulee");
			} else {

				String projectDir = System.getProperty("user.dir");
				// Generation d'un fichier temporaire pour l'impression
				File tempFile = new File(projectDir + File.separator
						+ "temp.pdf");
				try {
					// Generation du pdf
					GenerePdf
							.generePdfBulletinNotes(
									messageArea.getText(),
									(Responsable) responsableComboBox
											.getSelectedItem(),
									eleveSelectionne,
									modelBulletinNotes,
									tempFile,
									moyenneEleveValueLabel.getText(),
									moyenneClasseValueLabel.getText(),
									treatementAvisJury(),
									(Periode) periodeComboBox.getSelectedItem(),
									classeActuelle.getNom());
				} catch (PDFException ex) {
					System.err.println(ex);
					Tools.displayError(
							"Une erreur est survenue: " + ex.getMessage(),
							"Erreur");
				}
				try {
					// Generation de l'impression
					PrintPdf.printPdf(tempFile.getPath());

				} catch (IOException e1) {
					Tools.displayError(
							"Une erreur est survenue: " + e1.getMessage(),
							"Erreur");
				} catch (PrinterException e1) {
					Tools.displayError(
							"Une erreur est survenue: " + e1.getMessage(),
							"Erreur");
				} finally {
					// Suppression du fichier apres l'impression
					tempFile.deleteOnExit();

				}
			}
		}
	}

	/**
	 * Listener de changement de la selection de la periode (combobox) A chaque
	 * changement de selection , je reload les donnnees pour la periode
	 * selectionne par l'intermediaire du modelbulletinnotes
	 * 
	 * @author Julien
	 * 
	 */
	class PeriodeBulletinNotesListListener implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {
			modelBulletinNotes.refresh(((Periode) periodeComboBox
					.getSelectedItem()).getValue());
			resizeColumns();
			updateCalculsMoyennes();
		}
	}

}
